#ifndef CM_COLOR_SPACE_H_
#define CM_COLOR_SPACE_H_

#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
#define VALID_AREA(x,y,w,h) ((x) <= (w) && (y) <= (h))

struct rgbcolor {
	unsigned char r;
	unsigned char g;
	unsigned char b;
};

struct yuvcolor {
	unsigned char y;
	unsigned char u;
	unsigned char v;
};

enum cm_color_type {
	CM_COLOR_YUV420SP, CM_COLOR_YUV422P, CM_COLOR_RGB24
};

union cm_color {
	struct yuvcolor yuv;
	struct rgbcolor rgb;
};

/* 向图像数据中打字时需要的参数 */
struct draw_lattice_param {
	const char *str;/* 需要打印的字符串,注意编码一致 */

	enum cm_color_type type;

	unsigned char *img; /* 图像数据 */
	int w;
	int h;/* 图像宽高 */

	int x;
	int y; /* 打字起始坐标 */

	/* @FAULT 这个颜色值，在使用时，对于yuv类图像进行打字时默认使用的是color.yuv
	 * 对于RGB类的打字时默认使用color.rgb，使用时要注意避免按rgb的格式设置但是又按yuv的方式在使用
	 */
	union cm_color color;

	int scale; /* 打字尺寸比例，基于基础大小 */

};

/*
 * @brief 图像打字接口函数
 * @param 参数param中包含所有细节,包括图像数据要打字的位置,打字的内容 颜色等
 */
void draw_lattice(const struct draw_lattice_param *param);


/*
 colorspace: rgb - yuv

 R = Y + 1.4075 * (V - 128)
 G = Y - 0.3455 * (U - 128) - (0.7169 * (V - 128))
 B = Y + 1.7790 * (U - 128)

 Y = R *  .299000 + G *  .587000 + B *  .114000
 U = R * -.168736 + G * -.331264 + B *  .500000 + 128
 V = R *  .500000 + G * -.418688 + B * -.081312 + 128
 */

/* @brief
 *
 */
static inline void RGBColor2YUVColor(const struct rgbcolor* rgb, struct yuvcolor* yuv)
{
    yuv->y = rgb->r * 0.29 + rgb->g * 0.58 + rgb->b * 0.11;
    yuv->u = 128 - rgb->r * 0.16 - rgb->g * 0.33 + rgb->b * 0.50;
    yuv->v = 128 + rgb->r * 0.50 - rgb->g * 0.41 - rgb->b * 0.08;

	/* unsigned char?
	if (yuv->y > 255)
		yuv->y = 255;
	if (yuv->y < 0)
		yuv->y = 0;

	if (yuv->u > 255)
		yuv->u = 255;
	if (yuv->u < 0)
		yuv->u = 0;

	if (yuv->v > 255)
		yuv->v = 255;
	if (yuv->v < 0)
		yuv->v = 0;
		*/
}

#ifdef __cplusplus
}
#endif

#endif /* CM_COLOR_SPACE_H_ */
